package com.genreate.util.pay.wx.domain;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

import java.util.List;


/**
 * wx支付回调数据
 *
 * @author LYS
 * @date 2025-07-12
 */
@Data
public class WxPayNotifyInfo {
    /**
     * 【公众账号ID】
     * 商户下单时传入的公众账号ID
     * 必填，string(32)
     */
    @JsonProperty("appid")
    private String appid;

    /**
     * 【商户号】
     * 商户下单时传入的商户号
     * 必填，string(32)
     */
    @JsonProperty("mchid")
    private String mchid;

    /**
     * 【商户订单号】
     * 商户系统内部订单号，下单时传入
     * 必填，string(32)
     */
    @JsonProperty("out_trade_no")
    private String outTradeNo;

    /**
     * 【微信支付订单号】
     * 微信支付侧订单的唯一标识，订单支付成功后返回
     * 选填，string(32)
     */
    @JsonProperty("transaction_id")
    private String transactionId;

    /**
     * 【交易类型】
     * 返回当前订单的交易类型，枚举值：
     * - JSAPI：公众号支付、小程序支付
     * - NATIVE：Native支付
     * - APP：APP支付
     * - MICROPAY：付款码支付
     * - MWEB：H5支付
     * - FACEPAY：刷脸支付
     * 选填，string(16)
     */
    @JsonProperty("trade_type")
    private String tradeType;

    /**
     * 【交易状态】
     * 订单交易状态，枚举值：
     * - SUCCESS：支付成功
     * - REFUND：转入退款
     * - NOTPAY：未支付
     * - CLOSED：已关闭
     * - REVOKED：已撤销（仅付款码支付返回）
     * - USERPAYING：用户支付中（仅付款码支付返回）
     * - PAYERROR：支付失败（仅付款码支付返回）
     * 必填，string(32)
     */
    @JsonProperty("trade_state")
    private String tradeState;

    /**
     * 【交易状态描述】
     * 对交易状态的详细说明（如“支付成功”“未支付”等）
     * 必填，string(256)
     */
    @JsonProperty("trade_state_desc")
    private String tradeStateDesc;

    /**
     * 【银行类型】
     * 用户支付方式说明，订单支付成功后返回：
     * - 格式：银行简码_类型（DEBIT借记卡/CREDIT信用卡/ECNY数字人民币）
     * - 示例：ICBC_DEBIT（工商银行借记卡）、OTHERS（非银行卡支付，如余额）
     * 选填，string(32)
     */
    @JsonProperty("bank_type")
    private String bankType;

    /**
     * 【商户数据包】
     * 商户下单时传入的自定义数据包（用户不可见）：
     * - 长度不超过128字符
     * - 若下单时传入，则回调/查询时原样返回；否则不返回
     * 选填，string(128)
     */
    @JsonProperty("attach")
    private String attach;

    /**
     * 【支付完成时间】
     * 用户完成订单支付的时间，支付成功后返回：
     * - 格式：遵循rfc3339标准（yyyy-MM-DDTHH:mm:ss+TIMEZONE）
     * - 示例：2015-05-20T13:29:35+08:00（北京时间）
     * 选填，string(64)
     */
    @JsonProperty("success_time")
    private String successTime;

    /**
     * 【支付者信息】
     * 订单的支付者信息，支付成功后返回
     * 选填
     */
    @JsonProperty("payer")
    private Payer payer;

    /**
     * 【订单金额】
     * 订单金额信息
     * 选填
     */
    @JsonProperty("amount")
    private Amount amount;

    /**
     * 【场景信息】
     * 下单时传入的支付场景描述：
     * - 若下单时传入，则回调/查询时原样返回；否则不返回
     * 选填
     */
    @JsonProperty("scene_info")
    private SceneInfo sceneInfo;

    /**
     * 【优惠功能】
     * 代金券信息，当订单使用代金券时返回
     * 选填，array[object]
     */
    @JsonProperty("promotion_detail")
    private List<PromotionDetail> promotionDetail;


    /**
     * 支付者信息子实体
     */
    @Data
    public static class Payer {
        /**
         * 【用户标识】
         * 用户在微信支付平台的唯一标识（openid）
         * 选填，string(128)
         */
        @JsonProperty("openid")
        private String openid;
    }


    /**
     * 订单金额信息子实体
     */
    @Data
    public static class Amount {
        /**
         * 【总金额】
         * 订单总金额，单位为分
         * 选填，int
         */
        @JsonProperty("total")
        private Integer total;

        /**
         * 【用户支付金额】
         * 用户实际支付的金额（扣除优惠后），单位为分
         * 选填，int
         */
        @JsonProperty("payer_total")
        private Integer payerTotal;

        /**
         * 【货币类型】
         * 订单币种，默认CNY（人民币）
         * 选填，string(16)
         */
        @JsonProperty("currency")
        private String currency;

        /**
         * 【用户支付币种】
         * 用户支付的币种，默认与currency一致
         * 选填，string(16)
         */
        @JsonProperty("payer_currency")
        private String payerCurrency;
    }


    /**
     * 场景信息子实体
     */
    @Data
    public static class SceneInfo {
        /**
         * 【设备号】
         * 支付场景的设备ID（如终端设备号）
         * 选填，string(32)
         */
        @JsonProperty("device_id")
        private String deviceId;

        /**
         * 【商户端设备号】
         * 商户自定义的设备标识
         * 选填，string(32)
         */
        @JsonProperty("store_id")
        private String storeId;
    }


    /**
     * 优惠功能（代金券）子实体
     */
    @Data
    public static class PromotionDetail {
        /**
         * 【优惠金额】
         * 代金券抵扣的金额，单位为分
         * 选填，int
         */
        @JsonProperty("amount")
        private Integer amount;

        /**
         * 【代金券ID】
         * 代金券的唯一标识
         * 选填，string(32)
         */
        @JsonProperty("coupon_id")
        private String couponId;

        /**
         * 【优惠名称】
         * 代金券的名称
         * 选填，string(64)
         */
        @JsonProperty("name")
        private String name;

        /**
         * 【优惠范围】
         * 代金券的适用范围：
         * - GLOBAL：全场优惠
         * - SINGLE：单品优惠
         * 选填，string(32)
         */
        @JsonProperty("scope")
        private String scope;

        /**
         * 【商品明细】
         * 优惠适用的商品明细列表（当scope为SINGLE时返回）
         * 选填，array[object]
         */
        @JsonProperty("goods_detail")
        private List<GoodsDetail> goodsDetail;
    }


    /**
     * 商品明细子实体（优惠适用的商品）
     */
    @Data
    public static class GoodsDetail {
        /**
         * 【商品ID】
         * 商户侧商品的唯一标识
         * 选填，string(32)
         */
        @JsonProperty("goods_id")
        private String goodsId;

        /**
         * 【商品名称】
         * 商品的名称
         * 选填，string(256)
         */
        @JsonProperty("goods_name")
        private String goodsName;

        /**
         * 【商品单价】
         * 商品单价，单位为分
         * 选填，int
         */
        @JsonProperty("unit_price")
        private Integer unitPrice;

        /**
         * 【商品数量】
         * 商品购买数量
         * 选填，int
         */
        @JsonProperty("quantity")
        private Integer quantity;

        /**
         * 【优惠金额】
         * 该商品享受的优惠金额，单位为分
         * 选填，int
         */
        @JsonProperty("discount_amount")
        private Integer discountAmount;
    }
}